//
// Created by ASUS on 2024/1/11.
//
#include <bits/stdc++.h>
using namespace std;
#define int long long

const int N=1e5+5;

int n,m;

int tree[4*N],tag[4*N],a[N];

void pushup(int i){
	tree[i]=tree[i<<1]+tree[i<<1|1];
}

void build(int i,int l,int r){
	if(l==r){
		tree[i]=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(i<<1,l,mid);
	build(i<<1|1,mid+1,r);
	pushup(i);
}

void addtag(int i,int l,int r,int val){
	tree[i]+=(r-l+1)*val;
	tag[i]+=val;
}

void pushdown(int i,int l,int r){
	if(!tag[i]) return;
	int mid=(l+r)>>1;
	addtag(i<<1,l,mid,tag[i]);
	addtag(i<<1|1,mid+1,r,tag[i]);
	tag[i]=0;
}

void update(int i,int l,int r,int x,int y,int val){
	if(l>y||r<x) return;
	if(l>=x&&r<=y){
		addtag(i,l,r,val);
		return ;
	}
	pushdown(i,l,r);
	int mid=(l+r)/2;
	update(i<<1,l,mid,x,y,val);
	update(i<<1|1,mid+1,r,x,y,val);
	pushup(i);
}

int query(int i,int l,int r,int x,int y){
	if(x>r||y<l) return 0;
	if(x<=l&&y>=r) return tree[i];
	pushdown(i,l,r);
	int mid=(l+r)/2;
	return query(i<<1,l,mid,x,y)+ query(i<<1|1,mid+1,r,x,y);
}

signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	build(1,1,n);
	while(m--){
		int op;
		cin>>op;
		if(op==1){
			int x,y,k;cin>>x>>y>>k;
			update(1,1,n,x,y,k);
		}else{
			int x,y;cin>>x>>y;
			cout<<query(1,1,n,x,y)<<"\n";
		}
	}
	return 0;
}